//
//  WBStatusListViewModel.swift
//  weibo
//
//  Created by HanXujie on 2017/4/21.
//  Copyright © 2017年 thinker. All rights reserved.
//

import Foundation

/*
 在这里可以不继承任何父类
 
 如果需要使用KVC或者字典转模型框架设置对象值，类就要继承自NSObject
 如果类只包装一些代码逻辑（写了一些函数），可以不用任何父类，好处是：更加轻量级
 如果用OC写一律继承自NSObject
 
 实名：负责微博的数据处理
 1：字典转模型
 2：下拉、上拉数据的处理
 
 */


/// 上拉刷新最大尝试次数
fileprivate let maxPullupTryTimes = 3

class WBStatusListViewModel {
  
    
    /// 上拉刷新错误次数
    fileprivate var pullupErrorTimes = 0
    
    /// 懒加载微博模型数组
    lazy var statusList = [WBStatus]()


    
    /// 加载微博列表
    ///
    /// - Parameters:
    ///   - pullup: 是否上拉刷新
    ///   - completion: 完成回调，【网络请求是否成功，是否刷新表格】
    func loadStatus(pullup:Bool, completion:@escaping (_ isSuccess:Bool, _ shouldRefresh: Bool)->()) {
        
        // 判断是否是上拉刷新，同时检查刷新错误
        if pullup && pullupErrorTimes > maxPullupTryTimes {
            completion(true, false)
            return
        }
        
        
        //since_id 下拉刷新，取出数组第一条微博的id
        let since_id = pullup ? 0 : (statusList.first?.id ?? 0)
        
        // 上拉刷新，取出数组的最后一条微博的id
        let max_id = !pullup ? 0 :(statusList.last?.id ?? 0)
        
        // 获取数据
        WBNetworkManager.shared.statusList (since_id: since_id, max_id: max_id){ (list, isSuccess) in
            guard let array = NSArray.yy_modelArray(with:WBStatus.self , json: list ?? []) as? [WBStatus] else{
                
                completion(isSuccess, false)
                
                return
                
            }
            
            print("刷新了\(array.count)条数据")
            
            // 拼接数据
            // 下拉刷新，应该将结果数组拼接在数组的前面
            // 服务器返回的字典数组，就是按照时间的倒叙排序的
            if pullup{
                // 如果是上拉刷新将数组皮杰在数组的末尾
                self.statusList += array
            }else{
                // 如果是下拉刷新应该讲结果数组拼接在数组的前面
                self.statusList = array + self.statusList
            }
            
            // 判断上拉刷新的数据量
            if pullup && array.count == 0 {
                self.pullupErrorTimes += 1
                completion(isSuccess, false)
            }else{
                completion(isSuccess, true)
            }
            
            
        }
        
    }
}










